import axios, { AxiosError, type Method } from 'axios'
import { useUserStore } from '@/stores' // 引入用户状态存储
import { showToast } from 'vant' // 引入vant的提示组件
// import { useRouter } from 'vue-router' // 引入路由对象
// const router = useRouter() // 这段代码在模块加载时就执行了，此时还没有 Vue 组件实例，所以 useRouter() 无法获取到 router 实例。
// import type { Router } from 'vue-router' // 只导入类型
import router from '@/router'

const instance = axios.create({
  // TODO 1. 基础地址，超时时间
  baseURL: 'https://consult-api.itheima.net/', // 示例基础地址
  timeout: 10000 // 示例超时时间（毫秒）
})

instance.interceptors.request.use(
  (config) => {
    // TODO 2. 携带token
    const store = useUserStore()
    if (store.user?.token && config.headers) {
      config.headers.Authorization = `Bearer ${store.user.token}`
    }
    return config
  },
  (err) => Promise.reject(err)
)

instance.interceptors.response.use(
  (res) => {
    // TODO 3. 处理业务失败
    // TODO 4. 摘取核心响应数据
    // const { code, data, message } = res.data

    if (res.data?.code !== 10000) {
      // 错误提示
      showToast(res.data?.message || '业务失败')
      // 返回错误的promise
      return Promise.reject(res.data)
      // 传入 code 将来catch的时候可以使用
    }

    return res.data // 返回核心数据
  },
  (err: AxiosError) => {
    console.log(err)
    // TODO 5. 处理401错误
    if (err?.status === 401) {
      // 清除本地的用户信息
      const store = useUserStore()
      store.delUser() // 清除用户状态

      // 跳转到登录页面，携带当前访问页面的地址（包含参数的）

      router.push({
        path: '/login',
        query: { returnUrl: router.currentRoute.value.fullPath }
      })
      // 动态导入 router 并使用
      // import('@/router').then((module) => {
      //   const router: Router = module.default
      //   router.push({
      //     path: '/login',
      //     query: { returnUrl: router.currentRoute.value.fullPath }
      //   })
      // })
    }

    return Promise.reject(err)
  }
)

export default instance
type Data<T> = { code: number; data: T; message: string } //单独定义类型别名

// 封装请求方法
export const request = <T>(
  url: string,
  method: Method = 'POST',
  submitData?: object
) => {
  // 参数：地址，请求方式，提交的数据
  // 返回：promise
  /* return instance.request<any, { code: number; data: T; message: string }>({
    url,
    method,
    [method.toUpperCase() === 'GET' ? 'params' : 'data']: submitData
  }) */
  return instance.request<unknown, Data<T>>({
    url,
    method,
    [method.toUpperCase() === 'GET' ? 'params' : 'data']: submitData
  })
}
